# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import os
from urllib import request
from scrapy.pipelines.images import ImagesPipeline
from bmw import settings


class BmwPipeline(object):
    def __init__(self):
        # 路径拼接
        self.path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')
        # 判断文件是否存在
        if not os.path.exists(self.path):
            # 创建文件夹
            os.mkdir(self.path)

    def process_item(self, item, spider):
        category_title = item['category_title']
        urls = item['urls']
        catetory_path = os.path.join(self.path, category_title)

        if not os.path.exists(catetory_path):
            os.mkdir(catetory_path)
        for url in urls:
            image_name = url.split('_')[-1]
            request.urlretrieve(url, os.path.join(catetory_path, image_name))
        return item


class BmwImagesPipeline(ImagesPipeline):
    # 这个item为我们封装好的数据传过来的
    def get_media_requests(self, item, info):
        # 这个方法是在下载请求之前调用
        # 这个方法其实本身就是去发送下载请求的
        # 返回包含request对象的列表，request对象为图片的下载路径
        request_objs = super(BmwImagesPipeline, self).get_media_requests(item, info)
        for request_obj in request_objs:
            # 将item对象绑定到request_obj里面, 就相当于是给request对象添加一个item属性
            # 后面对传递给file_path去调用
            request_obj.item = item
        # 返回request_objs一个列表对象，让file_path调用
        return request_objs

    def file_path(self, request, response=None, info=None):
        # 这个方法是在图片将被存储的时候调用，用来获取图片存储的路径
        # 这个方法返回文件的存储路径
        path = super(BmwImagesPipeline, self).file_path(request, response, info)
        # 获取上面传过来的request_objs对象列表在内部被处理成一个一个的request_obj对象,里面的item属性里面的值
        category_title = request.item.get('category_title')  # 对应上面get_media_requests()函数里面的request_obj.item，是一个字典类型

        # 下面的所有操作都是在获取图片的存储路径
        image_store = settings.IMAGES_STORE
        category_path = os.path.join(image_store, category_title)
        if not os.path.exists(category_path):
            os.mkdir(category_path)
        # 因为path返回的的是一个存储路径（str类型），而我们这边是在重写路径
        image_name = path.replace('full/', '')
        image_path = os.path.join(category_path, image_name)
        return image_path
